#include <iostream>
#include <thread>
#include <chrono>
#include <signal.h>
#include "market_data/market_data_manager.h"
#include "market_data/ctp_md_interface.h"
#include <spdlog/spdlog.h>

using namespace hft;
using namespace std::chrono_literals;

// 全局变量用于处理信号
volatile bool g_running = true;

// 信号处理函数
void signalHandler(int signum) {
    spdlog::info("Received signal {}", signum);
    g_running = false;
}

int main() {
    try {
        // 设置日志级别
        spdlog::set_level(spdlog::level::debug);
        
        // 注册信号处理
        signal(SIGINT, signalHandler);
        signal(SIGTERM, signalHandler);
        
        // 创建CTP行情接口
        auto md_interface = std::make_shared<CtpMdInterface>(
            "tcp://180.168.146.187:10110",  // 模拟行情前置机地址
            "examples/config",               // 配置文件目录
            "8888",                         // 经纪商代码
            "888888",                       // 投资者账号
            "888888"                        // 密码
        );
        
        // 创建市场数据存储
        auto storage = std::make_shared<AsyncMarketDataStorage>(
            std::make_shared<CsvMarketDataStorage>("data/market_data", 5)
        );
        
        // 创建市场数据监控
        auto monitor = std::make_shared<MarketDataMonitor>();
        
        // 创建市场数据管理器
        MarketDataManager manager(md_interface, storage, monitor);
        
        // 初始化管理器
        if (!manager.initialize()) {
            spdlog::error("Failed to initialize market data manager");
            return 1;
        }
        
        // 启动管理器
        if (!manager.start()) {
            spdlog::error("Failed to start market data manager");
            return 1;
        }
        
        // 注册市场数据回调
        manager.registerMarketDataCallback([](const MarketDataMessage& data) {
            spdlog::info("Received market data: {} price={} volume={}", 
                        data.symbol, data.last_price, data.volume);
        });
        
        // 订阅合约
        std::vector<std::string> symbols = {
            "IF2403",  // 沪深300期货
            "IC2403",  // 中证500期货
            "IH2403"   // 上证50期货
        };
        
        int subscribed = manager.subscribe(symbols);
        spdlog::info("Subscribed {} symbols", subscribed);
        
        // 主循环
        while (g_running) {
            // 每分钟打印一次数据质量报告
            auto report = manager.getDataQualityReport();
            spdlog::info("Data quality report:");
            for (const auto& [symbol, stats] : report) {
                spdlog::info("{}: messages={} errors={} avg_delay={:.2f}ms", 
                            symbol, stats.message_count, stats.error_count, 
                            stats.avg_delay_ms);
            }
            
            // 打印存储统计
            spdlog::info("Storage stats: {} records", manager.getStorageStats());
            
            std::this_thread::sleep_for(60s);
        }
        
        // 停止管理器
        manager.stop();
        
        // 清理7天前的数据
        int cleaned = manager.cleanupOldData(7);
        spdlog::info("Cleaned {} old records", cleaned);
        
        spdlog::info("Market data example finished");
        return 0;
        
    } catch (const std::exception& e) {
        spdlog::error("Exception: {}", e.what());
        return 1;
    }
}